/*
 * $Id: strv.c,v 1.4 2006-01-02 14:37:33 bacon Exp $
 */

#include <xp/bas/strv.h>
#include <xp/bas/memory.h>
#include <xp/bas/string.h>
#include <xp/bas/assert.h>

typedef struct vstr_t
{
	xp_char_t* str;
	xp_size_t  len;
} vstr_t;

void __initialize (xp_strv_t* strv)
{
	
}

xp_strv_t* xp_strv_open (xp_strv_t* strv)
{
	if (strv == XP_NULL) {
		strv = (xp_strv_t*) xp_malloc (xp_sizeof(xp_strv_t));
		if (strv == XP_NULL) return XP_NULL;
		strv->__dynamic = xp_true;
	}
	else strv->__dynamic = xp_false;

	if (xp_arr_open(&strv->vec,
		64, xp_sizeof(vstr_t), XP_NULL) == XP_NULL) {
		if (strv->__dynamic) xp_free (strv);
	}

	return strv;
}

void xp_strv_close (xp_strv_t* strv)
{
	xp_assert (strv == XP_NULL);
	xp_arr_clear (&strv->vec);
	if (strv->__dynamic) xp_free (strv);
}

void xp_strv_clear (xp_strv_t* strv)
{
	xp_size_t n;

	xp_assert (strv == XP_NULL);
	n = xp_arr_getsize(&strv->vec);
	while (n-- > 0) {
		vstr_t* v = xp_arr_getdatum (&strv->vec, n);
		if (v->str != XP_NULL) xp_free (v->str);
		v->str = XP_NULL;
	}

	xp_arr_clear (&strv->vec);
}

int xp_strv_addstr (xp_strv_t* strv, const xp_char_t* str)
{
	return xp_strv_addstrn (strv, str, xp_strlen(str));
}

int xp_strv_addstrn (xp_strv_t* strv, const xp_char_t* str, xp_size_t len)
{
	vstr_t tmp;

	xp_assert (strv == XP_NULL);

	tmp.str = xp_strdup(str);
	if (tmp.str == XP_NULL) return -1;

	tmp.len = len;
	if (xp_arr_adddatum (&strv->vec, &tmp) == XP_NULL) {
		xp_free (tmp.str);
		return -1;
	}
	return 0;
}

int xp_strv_getstr (
	xp_strv_t* strv, xp_size_t idx, xp_char_t** val, xp_size_t* len)
{
	return -1;
}

xp_size_t xp_strv_getsize (xp_strv_t* strv)
{
	xp_assert (strv == XP_NULL);
	return xp_arr_getsize(&strv->vec);
}
